package com.lly.songhigh.service;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

import com.lly.songhigh.R;
import com.lly.songhigh.download.DownloadTask;
import com.lly.songhigh.download.DownloadUtil;
import com.lly.songhigh.download.DownloadUtil.IOnDownloadListener;
import com.lly.songhigh.download.NotificationBean;
import com.lly.songhigh.eventbus.MyEvent;
import com.lly.songhigh.utils.SharedPreferencesUtils;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import de.greenrobot.event.EventBus;

public class DownloadServices extends Service {
    private String fileName;
    private Context mContext = DownloadServices.this;
    /**
     * 正在下载
     */
    private final int DOWN_LOADING = 0;
    /**
     * 下载完成
     */
    private final int DOWN_COMPLETE = 1;
    /**
     * 下载失败
     */
    private final int DOWN_ERR = 2;
    /**
     * Timer 执行时间间隔
     */
    private final int TIMER_PERIOD = 1500;

    protected Timer mTimer;
    //消息通知栏
    protected NotificationManager mNotificationManager;
    /**
     * 下载任务管理
     */
    protected Map<String, DownloadTask> map_downloadtask;
    private String mUrl;
    private int mNotifyId;
    private int downloadCount;

    //绑定服务
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    //销毁服务
    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    public void onEvent(MyEvent.DldMessage dldMessage) {
        SharedPreferencesUtils.getSharePreInt(mContext, "DownLoad", "count");
        downloadCount++;
        SharedPreferencesUtils.putSharePre(mContext, "DownLoad", "count", downloadCount);
        mUrl = dldMessage.getUrl();
        fileName = dldMessage.getFileName();
        Notification mNotification = new NotificationBean(this, R.mipmap.play_icn_dld_prs, "开始下载", System.currentTimeMillis(), fileName);
        mNotifyId = downloadCount;
        System.out.println("NotifyId = " + mNotifyId);
        if (map_downloadtask.containsKey(mUrl)) {
            Toast.makeText(mContext, "已存在此下载任务", Toast.LENGTH_SHORT).show();
        } else {
            DownloadTask mDownloadTask = new DownloadTask();
            mDownloadTask.setUrl(mUrl);
            mDownloadTask.setNotifyID(mNotifyId);
            mDownloadTask.setNotification(mNotification);
            map_downloadtask.put(mUrl, mDownloadTask);
            //重启线程
            Runnable mRunnable = new MyRunnable(mDownloadTask);
            //开启新线程
            new Thread(mRunnable).start();
        }
        Log.i("lhl", "文件名 = " + fileName);
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        mTimer = new Timer();
        EventBus.getDefault().register(this);
        //调取系统服务
        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        map_downloadtask = new HashMap<>();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        EventBus.getDefault().post(new MyEvent.IsDlding(true));
        return super.onStartCommand(intent, flags, startId);
    }

    class MyRunnable implements Runnable {
        private DownloadUtil mDownUtil = new DownloadUtil();
        private DownloadTask mDownTask;
        private Handler mHandler;
        private TimerTask mTimerTask;

        public MyRunnable(DownloadTask downTask) {
            super();
            this.mDownTask = downTask;
            this.mHandler = new MyHandler(mDownUtil);
            this.mTimerTask = new MyTimerTask(mDownUtil, mHandler, mDownTask);
        }

        @Override
        public void run() {
            mTimer.schedule(mTimerTask, 0, TIMER_PERIOD);
            mDownUtil.downloadFile(mDownTask.getUrl(), fileName);
        }

    }

    class MyTimerTask extends TimerTask {
        private Handler mHandler;
        private DownloadUtil mDownUtil;
        private DownloadTask mDownTask;
        private IOnDownloadListener mListener;

        public MyTimerTask(DownloadUtil downUtil, Handler handler, DownloadTask downTask) {
            super();
            this.mHandler = handler;
            this.mDownUtil = downUtil;
            this.mDownTask = downTask;
            this.mListener = new IOnDownloadListener() {
                @Override
                public void updateNotification(int progress, int totalSize, File downFile) {
                    // TODO Auto-generated method stub
                    int rate = 0;
                    // 计算百分比
                    if (totalSize > 0) {
                        rate = progress * 100 / totalSize;
                        //下载进行中
                        mHandler.obtainMessage(DOWN_LOADING, rate, mDownTask.getNotifyID(), mDownTask.getNotification()).sendToTarget();
                    } else if (totalSize == 0) {

                        //下载进行中
                        mHandler.obtainMessage(DOWN_LOADING, 0, mDownTask.getNotifyID(), mDownTask.getNotification()).sendToTarget();
                    } else {
                        cancel();

                        //下载失败
                        mHandler.obtainMessage(DOWN_ERR, mDownTask).sendToTarget();
                    }
                    // 是否下载结束
                    if (totalSize > 0 && null != downFile && totalSize == (int) downFile.length()) {
                        cancel();
                        //下载完成
                        mHandler.obtainMessage(DOWN_COMPLETE, downFile).sendToTarget();
                        map_downloadtask.remove(mDownTask.getUrl());// 移除已完成任务
                        System.out.println("DOWN_COMPLETE ==> totalSize ==> " + totalSize);
                    }
                }

            };
        }

        @Override
        public void run() {
            mDownUtil.setOnDownloadListener(mListener);
        }
    }

    class MyHandler extends Handler {
        private DownloadUtil mDownUtil;

        public MyHandler(DownloadUtil downUtil) {
            super();
            this.mDownUtil = downUtil;
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case DOWN_LOADING://下载过程中
                    ((Notification) msg.obj).contentView.setProgressBar(R.id.pb, 100, msg.arg1, false);
                    ((Notification) msg.obj).contentView.setTextViewText(R.id.tv, msg.arg1 + "%");
//                    ((Notification) msg.obj).contentView.setTextViewText(R.id.downloading_songName, fileName);
                    mNotificationManager.notify(msg.arg2, ((Notification) msg.obj));
                    break;
                case DOWN_COMPLETE://下载完成
                    mNotificationManager.cancel(mNotifyId);
                    removeMessages(DOWN_LOADING);
                    Toast.makeText(mContext, "下载完成", Toast.LENGTH_SHORT).show();
//				mDownUtil.installApk(mContext, (File)msg.obj);
                    System.out.println("======================DOWN_COMPLETE================================");
                    stopService();
                    break;
                case DOWN_ERR://下载失败
                    removeMessages(DOWN_LOADING);
                    map_downloadtask.remove(((DownloadTask) msg.obj).getUrl());
                    Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();
                    stopService();
                    break;
                default:
                    break;
            }
        }

        /**
         * 如果无下载任务，关闭服务
         */
        private void stopService() {
            if (map_downloadtask.isEmpty()) {
                stopSelf(-1);
            }
        }

    }

}
